<?php
/**
 * bDispatcher
 *
 * Parseur pour l'URL
 * Coordonne les différents éléments du framework
 * Cette classe est un Singleton
 *
 * @package bottleneck
 * @subpackage core
 * @author Thomas Lenoel
 * @copyright 2010 Thomas Lenoel
 * @version 0.1
 * @license http://www.gnu.org/licenses/gpl.html GNU General Public License version 3
 */
class bDispatcher {

    /**
     * Nom du module à appeler
     *
     * @var string
     */
    private $module;

    /**
     * Nom du contrôleur à instancier
     *
     * @var string
     */
    private $controller;

    /**
     * Nom de l'action à exécuter
     *
     * @var string
     */
    private $action;

    /**
     * Instance de la vue générée
     *
     * @var bView
     */
    private $view;

    /**
     * Instance unique de bDispatcher
     *
     * @var bDispatcher
     */
    private static $_dispatch = null;

    /**
     *
     * @param string $configFile
     */
    private function  __construct($configFile=null, $go = true) {
        // @codeCoverageIgnoreStart
        if ($go) {
            try {
                $this->parse();
                $this->run();
            } catch(bException $e) {
                $e->show();
            }
        }
        // @codeCoverageIgnoreEnd
    }


    /**
     *
     * @param string $configFile
     * @return bDispatcher
     */
    public static function getInstance($configFile=null, $go=true) {

        static $_disp = null;

        if(!isset($_disp)) {
            $_disp = new self($configFile, $go);
        } 
        return $_disp;
    }


    /**
     * Parcoure le pathinfo et en extrait le triplet module/ctrl/action
     */
    public function parse() {
        $chain = explode('/', $_SERVER['PATH_INFO']);

        if(!isset($chain[1])) bError::moduleNotExists();
        $this->module = $chain[1];

        if(!isset($chain[2])) bError::controllerNotExist();
        $this->controller = $chain[2];

        if (!isset($chain[3])) bError::actionNotExist();
        $this->action = $chain[3];
    }

    /**
     * Appelle le triplet mod/ctl/act
     */
    public function run() {

        if(!file_exists(APP_PATH.'modules/'.$this->module.'/controllers/')) bError::moduleNotExists();
        if(!file_exists(APP_PATH.'modules/'.$this->module.'/controllers/'.$this->controller.'.ctrl.php')) bError::controllerNotExist();

        require_once(APP_PATH.'modules/'.$this->module.'/controllers/'.$this->controller.'.ctrl.php');

        $ccall = $this->controller.'Ctrl';
        $acall = $this->action;

        $ctl = new $ccall;
        $this->view = $ctl->$acall();

        if(!empty($this->view)) $this->view->render();
    }


    /**
     * Mutateur de la vue
     *
     * @param bView $view
     */
    public function setView($view){
        $this->view = $view;
    }


    /**
     * Accesseur de la vue
     *
     * @return bView
     */
    public function getView() {
        return $this->view;
    }

}
?>
